﻿#include<iostream>
using namespace std;
#include<string>


//class People
//{
//public:
//	void Print()
//	{
//		cout << _name << endl;
//		cout << _age << endl;
//	}
//private:
//	string _name = "小明";
//	int _age = 18;
//};
//
//class Student :public People
//{
//private:
//	int _stuid = 222222;
//};

//class Person
//{
//public:
//	string _name; // 姓名
//	string _sex;// 性别
//	int _age; // 年龄
//};
//
//class Student : public Person
//{
//public:
//	int _No; // 学号
//};
//
//void Test()
//{
//	//Student sobj;
//	//// 1.子类对象可以赋值给父类对象/指针/引用
//	//Person pobj = sobj;
//	//Person* pp = &sobj;
//	//Person& rp = sobj;
//
//	//// 2.基类的指针可以通过强制类型转换赋值给派生类的指针
//	//pp = &sobj;
//	//Student * ps1 = (Student*)pp; // 这种情况转换时可以的。
//	//ps1->_No = 10;
//
//	//pp = &pobj;
//	//Student* ps2 = (Student*)pp; // 这种情况转换时虽然可以，但是会存在越界访问的问题
//	//ps2->_No = 10;
//	Student s;
//	Person p;
//	//
//	//	// 跟下面机制不一样
//	//	// 特殊语法规则：不是类型转换，中间没有产生临时变量
//	p = s;
//	Person* ptr = &s;
//	Person& ref = s;
//	ptr->_name += 'x';
//	ref._name += 'y';
//	s._name += 'z';
//	cout << s._name << endl;
//	cout << ref._name << endl;
//	cout << ptr->_name << endl;
//	int i = 1234;
//	printf("%x\n", i);
//}

//class Person
//{
//public:
//	void fun()
//	{
//		cout << "func()" << endl;
//	}
//protected:
//	string _name = "李大明";//姓名
//	int _num = 111;//身份证号
//};
//
//class Student :public Person
//{
//public:
//	void fun(int i)
//	{
//		Person::fun();
//		cout << "func(int i)->" << i << endl;
//	}
//
//	void Print()
//	{
//		cout << " 姓名:" << _name << endl;
//		cout << " 身份证号:" << Person::_num << endl;
//		cout << " 学号:" << _num << endl;
//	}
//protected:
//	int _num = 999; // 学号
//};

//void Test()
//{
//	Student s1;
//	s1.Print();
//
//	Student b;
//	b.fun(10);
//};

//class Student;
//class Person
//{
//public:
//	friend void Display(const Person& p, const Student& s);
//protected:
//	string _name; // 姓名
//};
//
//class Student : public Person
//{
//protected:
//	int _stuNum; // 学号
//};
//
//void Display(const Person& p, const Student& s)
//{
//	cout << p._name << endl;
//	cout << s._stuNum << endl;//基类友元不能访问子类私有和保护成员。
//}
//void Test()
//{
//	Person p;
//	Student s;
//	Display(p, s);
//}

class Person
{
public:
	string _name; // 姓名
};
class Student : virtual public Person
{
protected:
	int _num; //学号
};
class Teacher : virtual public Person
{
protected:
	int _id; // 职工编号
};
class Assistant : public Student, public Teacher
{
protected:
	string _majorCourse; // 主修课程
};
void Test()
{
	Assistant a;
	a._name = "peter";
}

int main()
{
	Test();
	return 0;
}